//package com.atguigu.gmall.gateway.filter;
//
//import com.atguigu.gmall.common.utils.JwtUtils;
//import com.atguigu.gmall.gateway.config.JwtProperties;
//import org.springframework.boot.context.properties.EnableConfigurationProperties;
//import org.springframework.cloud.gateway.filter.GatewayFilterChain;
//import org.springframework.cloud.gateway.filter.GlobalFilter;
//import org.springframework.core.Ordered;
//import org.springframework.http.HttpCookie;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.server.reactive.ServerHttpRequest;
//import org.springframework.http.server.reactive.ServerHttpResponse;
//import org.springframework.stereotype.Component;
//import org.springframework.util.AntPathMatcher;
//import org.springframework.util.CollectionUtils;
//import org.springframework.util.MultiValueMap;
//import org.springframework.web.server.ServerWebExchange;
//import reactor.core.publisher.Mono;
//
//import javax.annotation.Resource;
//import java.net.URI;
//import java.util.Arrays;
//import java.util.List;
//import java.util.Map;
//
///*
//所有的网关过滤器只有访问网关的请求匹配到了路由之后才会生效
//根据作用域：
//    全局filter：对所有的路由都生效
//        如果项目路径设计时考虑了统一鉴权 可以使用全局： /auth/**表示需要鉴权的路径
//    局部filter：  对配置了filter的路由生效
//        针对一部分路由生效
//
//根据作用时机：
//    pre：
//        在请求放行给路由目标服务前
//    post：
//        目标服务处理请求后返回结果给客户端前
// */
//@Component
//@EnableConfigurationProperties(JwtProperties.class)
//public class GlobalAuthGatewayFilter implements GlobalFilter, Ordered {
//    @Resource
//    JwtProperties jwtProperties;
//    //过滤方法： 每次访问网关的请求只要匹配到了路由 都会经过过滤方法处理
//    @Override
//    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//        ServerHttpRequest request = exchange.getRequest();
//        ServerHttpResponse response = exchange.getResponse();
//        //黑名单白名单
//        //获取请求报文中的cookie：
//        System.out.println("当前路径："+request.getURI().getPath());
//        //   /auth/createOrder    /auth/user/index     /auth/xxx
////        AntPathMatcher antPathMatcher = new AntPathMatcher();
////        antPathMatcher.match("/auth/**",request.getURI().getPath());
//        //设置路径白名单： 登录页面路径 和首页希望放行 不验证登录状态
//        List<String> paths = Arrays.asList("/", "/toLogin.html", "/login");
//        if(paths.stream().anyMatch(path-> path.indexOf(request.getURI().getPath())!=-1)){
//            return chain.filter(exchange);
//        }
//
//
//        MultiValueMap<String, HttpCookie> cookies = request.getCookies();
//        if(!CollectionUtils.isEmpty(cookies)
//            && cookies.containsKey(jwtProperties.getCookieName())){
//            HttpCookie cookie = cookies.getFirst(jwtProperties.getCookieName());
//            System.out.println("GMALL-TOKEN : "+cookie.getValue());
//            try {
//                Map<String, Object> map = JwtUtils.getInfoFromToken(cookie.getValue(), jwtProperties.getPublicKey());
//
//                //token解析没有异常放行请求
//                return chain.filter(exchange);
//            } catch (Exception e) {
//                //e.printStackTrace();
//                //token解析失败： token过期或者token被篡改
//
//            }
//        }
//
//        //请求报文没有携带token+ //token解析失败： token过期或者token被篡改
//        //给浏览器响应
//        response.setStatusCode(HttpStatus.SEE_OTHER);
//        response.getHeaders().setLocation(URI.create("http://sso.gmall.com/toLogin.html"));
//        return response.setComplete();
//    }
//    //返回值越小 优先级越高
//    @Override
//    public int getOrder() {
//        return 0;
//    }
//}
